package builder;

import lombok.*;
import lombok.experimental.Accessors;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


//@Getter
//@Setter
@Data
//@Accessors(fluent = true, chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class Student {

//    public Student(String name, Integer age, Integer sex) {
//        this.name = name;
//        this.age = age;
//        this.sex = sex;
//    }
//
//    public Student(String name, Integer age) {
//        this.name = name;
//        this.age = age;
//    }

    @Builder.Default
    private String name = "小明";

    private String lastNames;

    private Integer age;

//    @Builder.ObtainVia(field = "hobbies")
    private String hobby;

    // 供hobby获取值使用
//    private String hobbies = "唱跳RAP";

    /**
     * 性别 0-女 1-男
     */
    private Integer sex;

    /**
     * 介绍
     */
//    @Builder.ObtainVia(method = "describe", isStatic = true)
    private String describe;

    private static String describe(Student student) {
        return "小明的自我介绍";
    }

    // 非静态方法赋值
//    private String describe() {
//        return "小明的自我介绍";
//    }

    private String country;

    /**
     * 科目
     */
    @Singular(ignoreNullCollections = true)
    private List<String> subjects;

//    private Student(Builder builder) {
//        this.name = builder.name;
//        this.age = builder.age;
//        this.hobby = builder.hobby;
//        this.sex = builder.sex;
//        this.describe = builder.describe;
//        // 新增赋值
//        this.country = builder.country;
//    }

//    public static Builder builder() {
//        return new Builder();
//    }
//
//    public static class Builder {
//        private String name;
//        private Integer age;
//        private String hobby;
//        private Integer sex;
//        private String describe;
//        private String country;
//
//        // 私有构造方法
//        private Builder() {
//
//        }
//
//        public Builder name(String val) {
//            this.name = val;
//            return this;
//        }
//
//        public Builder age(Integer val) {
//            this.age = val;
//            return this;
//        }
//
//        public Builder hobby(String val) {
//            this.hobby = val;
//            return this;
//        }
//
//        public Builder sex(Integer val) {
//            this.sex = val;
//            return this;
//        }
//
//        public Builder describe(String val) {
//            this.describe = val;
//            return this;
//        }
//
//        public Builder country(String val) {
//            this.country = val;
//            return this;
//        }
//
//        public Student build() {
//            return new Student(this);
//        }
//    }

}

class TestBuilder {
    public static void main(String[] args) {
        // 逐个set
//        Student xm = new Student();
//        xm.setName("小明");
//        xm.setAge(23);
//        xm.setSex(1);

        // 构造函数
//        Student xm2 = new Student("小明", 23, 1);
//
//        Student xm3 = new Student("小明", 23);

//        Student xm4 = Student.builder().name("小明").age(23).build();
//
//        Student xm5 = Student.builder().name("小明").age(23).sex(1).build();
//
//        Student xm6 = Student.builder().name("小明").hobby("代码").build();
//
//        Student xm7 = Student.builder().name("小明").country("中国").build();
//
//        Student xm8 = xm7.toBuilder().age(23).build();

        // 这里我们创建一个25岁的小明
//        Student xm9 = new Student().age(25).name("小明");
        // do something

        // 这里需要对25岁的小明进行修改，可直接进行赋值，之后重新复用这个对象
//        xm9.country("中国");

        // 测试ObtainVia注解
//        System.out.println(new Student().toBuilder().build().getHobby());

        // 测试 非静态 and 静态 方法赋值
//        System.out.println(new Student().toBuilder().build().getDescribe());

        Student xm11 = Student.builder()
                .subject("Math").subject("Chinese")
                .subjects(Arrays.asList("English", "History")).build();

//        System.out.println(xm11.getSubjects().toString());

        xm11.getSubjects().add("Java");

        System.out.println(xm11.toBuilder().clearSubjects().build().getSubjects().toString());
    }
}